#include "main.h"
u8               gu8_komssendwait;
bool             gb_handshake;
KUART_t          kmos_comm;
u8               rekmosdate[9];
u8               sendkmosdate[4];
bool             kmosl_firoff_f;
bool             kmosr_firoff_f;
u16              kmos_ltemper;
u16              kmos_mtemper;
u16              kmos_rtemper;
/****************************************
 * ???:	 ��ʼ��
 * ??:	
 * ??:	
 * ??:	
 ****************************************/
void Kuart_init(void)
{
    kmos_comm.sending_f = false;
    kmos_comm.recved_f  = false;
    kmos_comm.rx_byte_tmr = 0;
    kmos_comm.tx_ct = 0;
    kmos_comm.rx_ct = 0;
    rekmosdate[0] = 0;
    rekmosdate[1] = 0;
    sendkmosdate[0] = 0;
    sendkmosdate[1] = 0x80;
}
/****************************************
   
 ****************************************/
void Kuart_byte_tmr_dn(KUART_t * c_uart)
{
    //uint8_t_dn(&c_uart->rx_byte_tmr);					//
	if (c_uart->rx_byte_tmr)
		c_uart->rx_byte_tmr--;
}
/****************************************
 * ???:	 ��KMOS��������
 * ??:	
 * ??:	
 * ??:	
 ****************************************/
void send_kmos_comm(void)
{
    static u8 send_t = 0;
    static u8 temp_ct = 0;
    u8 i;
    if(gb_TestFlag)
        return;

	if ((++temp_ct >= 100)&& (panel_comm.sending_f == 0)) //
	{
        temp_ct = 0;
        // gb_scope = 1;	
        // gu16_tubecurt = get_average_ad(TUBE_CURRENT_CH);	
        // DataScope_Get_Channel_Data(gu16_tubecurt , 1);
        // DataScope_Get_Channel_Data(gu8_STubeError , 2);
        // DataScope_Get_Channel_Data(gu8_BTubeError , 3);
        // DataScope_Get_Channel_Data(gans_L.diptempr , 4);        


        // Send_Count = DataScope_Data_Generate(3); //生成10个通道的 格式化帧数据，返回帧数据长度
        // for(i = 0;i<=Send_Count;i++)
        // {
        //     kmos_comm.tx_buf[i] = DataScope_OutPut_Buffer[i];
        // }
        ano_scope = true;
        
        ano_get_channel_data(tempr_box.cur, kmos_comm.tx_buf, ANODP_TYPE_16, 1);
        ano_get_channel_data(tempr_bom.cur, kmos_comm.tx_buf, ANODP_TYPE_8, 2);
        ano_get_channel_data(STEAM_PID.u16_itemtemp, kmos_comm.tx_buf, ANODP_TYPE_8, 3);
        ano_get_channel_data(STEAM_PID.u8_iPriVal, kmos_comm.tx_buf, ANODP_TYPE_8, 4);
		ano_get_channel_data(tempr_top.cur, kmos_comm.tx_buf, ANODP_TYPE_16, 5);
        ano_get_channel_data(BAKE_PID.u16_itemtemp, kmos_comm.tx_buf, ANODP_TYPE_16, 6);
        ano_get_channel_data(BAKE_PID.u8_iPriVal, kmos_comm.tx_buf, ANODP_TYPE_8, 7);
        //8byte(额外字节) + U8通道数*1byte + U16通道数*2;
        ano_count = ano_data_generate(0xF1, kmos_comm.tx_buf);

        kmos_comm.sending_f = true;
		UART_SendByte(UART0, kmos_comm.tx_buf[0]);
        return;
	}  
    return;    

    if(gu8_komssendwait)
    {
        send_t = 10;
        if(system_100ms_f)
            gu8_komssendwait--;
    }      
    if (++send_t >= 13) //130ms
    {

        send_t = 0;
        {
            sendkmosdate[0] = smoker.level;
            sendkmosdate[1] = 0x00;//0x80
            if(knobl.sta == KNOB_OPEN)
            {
                sendkmosdate[1] |= 0x01;
                if(sta_Lfire)
                    sendkmosdate[1] |= 0x02;
            }
            sendkmosdate[2] = 0x00;//  中灶
            sendkmosdate[3] = 0x00;//  右灶            
            if(knobr.sta == KNOB_OPEN)
            {
                sendkmosdate[3] |= 0x01;
                if(sta_Rfire)
                    sendkmosdate[3] |= 0x02;
            }
            
        }  
        kmos_comm.tx_buf[0] = 0xA5;     
        if(gb_handshake)
        {
            gb_handshake = 0;
            kmos_comm.tx_buf[1] = 0x05;
            kmos_comm.tx_buf[2] = 0;
            kmos_comm.tx_buf[3] = 0x92; //  
            kmos_comm.tx_buf[4] = get_check_sum(kmos_comm.tx_buf, kmos_comm.tx_buf[1]); //    
        }
        else
        {
            kmos_comm.tx_buf[1] = 0x07;
            kmos_comm.tx_buf[2] = sendkmosdate[0];
            kmos_comm.tx_buf[3] = sendkmosdate[1]; //
            kmos_comm.tx_buf[4] = sendkmosdate[2]; //
            kmos_comm.tx_buf[5] = sendkmosdate[3]; //
            kmos_comm.tx_buf[6] = get_check_sum(kmos_comm.tx_buf, kmos_comm.tx_buf[1]);
        }
        kmos_comm.tx_ct = 0;
        kmos_comm.sending_f = true;
		UART_SendByte(UART0, kmos_comm.tx_buf[0]);   
    }
}
/****************************************
 * ???:	 KMOS�������ݴ���
 * ??:	
 * ??:	
 * ??:	
 ****************************************/
void receive_koms_deal(void)
{
    static u8 check = 0;
    static u16 elen = 0;     
    
    if(kmos_comm.recved_f)
    {
        kmos_comm.err_tmr_ct = 0;
        if(gb_tcomd2)
        {
            gb_tcomd2 = 0;
            gu8_tcomd2error = 0;
            elen = kmos_comm.rx_buf[1];  
            check = get_check_sum(kmos_comm.rx_buf, kmos_comm.rx_buf[1]);
            if(check == kmos_comm.rx_buf[elen-1])   
            {                
				kmos_comm.tx_buf[0] = 0X5A;
				kmos_comm.tx_buf[1] = 0x06; //
				kmos_comm.tx_buf[2] = 0xfc;//  
				kmos_comm.tx_buf[3] = 0x00;//  
                kmos_comm.tx_buf[4] = 0x00;//
				kmos_comm.tx_buf[5] = get_check_sum(kmos_comm.tx_buf, 6);
				kmos_comm.tx_ct = 0;
				kmos_comm.sending_f = true; 
                UART_SendByte(UART0, kmos_comm.tx_buf[0]);				
            }
            kmos_comm.recved_f = 0;
            return;
        }        
        elen = kmos_comm.rx_buf[1]; 
        check = get_check_sum(kmos_comm.rx_buf, kmos_comm.rx_buf[1]);
        if(check == kmos_comm.rx_buf[elen-1])
        {
            
            if((kmos_comm.rx_buf[0] == 0xA5)&&(kmos_comm.rx_buf[1] == 0x05)&&(kmos_comm.rx_buf[2] == 0x00)&&(kmos_comm.rx_buf[3] == 0x90))
            {
                gb_handshake = 1;
            }  
            else
            {          
                rekmosdate[0] = kmos_comm.rx_buf[2];//风机档位
                if(kmos_comm.rx_buf[3] &0x01)
                    kmosl_firoff_f = 1;


                if(kmos_comm.rx_buf[9] &0x01)//5
                    kmosr_firoff_f = 1;
                kmos_ltemper = MAKEWORD(kmos_comm.rx_buf[4],kmos_comm.rx_buf[5]);
                kmos_mtemper = MAKEWORD(kmos_comm.rx_buf[7],kmos_comm.rx_buf[8]);
                kmos_rtemper = MAKEWORD(kmos_comm.rx_buf[10],kmos_comm.rx_buf[11]);

            }               
        }
        kmos_comm.recved_f = 0;
    }
    
    kmos_comm.err_tmr_ct++;
    if(kmos_comm.err_tmr_ct >= 1000)
    {
        kmos_comm.err_tmr_ct = 1000;
    }
}
/****************************************
 * ???:	 KMOS��������
 * ??:	
 * ??:	
 * ??:	
 ****************************************/
void Kuart_recv_byte_isr(void)
{
	u8 euart_rx_data;
	u8 epacket_len = 0;

	/* Receive one date */
	// euart_rx_data = EUART_RecByte();		//
    euart_rx_data = UART_RecByte(UART0);	    
	
  	if(!kmos_comm.rx_byte_tmr) 							//
		  kmos_comm.rx_ct = 0;			                //last recv byte timeout! reset recv!!!
	kmos_comm.rx_byte_tmr = RX_RST_TIME;
	
	if (kmos_comm.recved_f)
		return;
 		
  	if(!kmos_comm.rx_ct)
  	{
  		if ((euart_rx_data != 0x5A) && (euart_rx_data != 0xA5))
  			return;
	}

    if(kmos_comm.rx_ct == 4)
    {
        if((kmos_comm.rx_buf[0] == 0x5A)&&(kmos_comm.rx_buf[2] == 0xFC))
        {
            if(gu8_SystemBeginTime > 0)
            {
                gb_tcomd2 = 1;
            }
        }
    }
	kmos_comm.rx_buf[kmos_comm.rx_ct] = euart_rx_data;
	kmos_comm.rx_ct++;	


    if(kmos_comm.rx_ct >= 2)
    {
        epacket_len = kmos_comm.rx_buf[1];                           
        if((epacket_len > KUART_RX_BYTES)||(epacket_len == 0))
        {
            kmos_comm.rx_ct = 0;
            return ;
        }            
    }
    else 
        return; 
	if (kmos_comm.rx_ct >= epacket_len)
	{
		kmos_comm.rx_ct = 0;   		//
		kmos_comm.recved_f = true;    //	
	}
}
/****************************************
 * ???:	 KMOS��������
 * ??:	
 * ??:	
 * ??:	
 ****************************************/
void Kuart_send_byte_isr(void)
{
	u8 len;

	if (kmos_comm.sending_f)
	{
		//len = MAKEWORD(speak_comm.tx_buf[7],speak_comm.tx_buf[8]) + 12;						//*******
		len = kmos_comm.tx_buf[1];

        // if (gb_scope)
        //     len = Send_Count;  
        #if ANODP_LOG_EN
        if(ano_scope)  
            len = ano_count;  
        #endif        
		kmos_comm.tx_ct++;
		if (kmos_comm.tx_ct < len)
		{
			// EUART_SendByte(speak_comm.tx_buf[speak_comm.tx_ct]);
            UART_SendByte(UART0, kmos_comm.tx_buf[kmos_comm.tx_ct]);              
		}
		else
		{
            // if(gb_scope)
            //     gb_scope = 0;            
			kmos_comm.tx_ct = 0;
			kmos_comm.sending_f = false; 					//????????
		}

		return;
 	}

    kmos_comm.tx_ct = 0;
}
